package me.mingshan.leetcode;

/**
 * https://leetcode.cn/problems/can-place-flowers/description/
 * <p>
 * 假设有一个很长的花坛，一部分地块种植了花，另一部分却没有。可是，花不能种植在相邻的地块上，它们会争夺水源，两者都会死去。
 * <p>
 * 给你一个整数数组 flowerbed 表示花坛，由若干 0 和 1 组成，其中 0 表示没种植花，1 表示种植了花。另有一个数 n ，能否在不打破种植规则的情况下种入 n 朵花？能则返回 true ，不能则返回 false 。
 * <p>
 * <p>
 * <p>
 * 示例 1：
 * <p>
 * 输入：flowerbed = [1,0,0,0,1], n = 1
 * 输出：true
 * 示例 2：
 * <p>
 * 输入：flowerbed = [1,0,0,0,1], n = 2
 * 输出：false
 *
 * @author hanjuntao
 * @date 2025/6/5 0005
 */
public class L_605_can_place_flowers {

    public static void main(String[] args) {
//        int[] source = {1, 0, 0, 0, 1};
//        System.out.println(canPlaceFlowers(source, 1));
//        System.out.println(canPlaceFlowers(source, 2));
//
//
//        int[] source2 = {0};
//        System.out.println(canPlaceFlowers(source2, 1));
//
//        int[] source3 = {0, 0, 1, 0, 1};
//        System.out.println(canPlaceFlowers(source3, 1));

        int[] source4 = {0, 0, 1, 0, 0};
        System.out.println(canPlaceFlowers(source4, 1));
    }

    public static boolean canPlaceFlowers(int[] flowerbed, int n) {
        int remain = n;

        if (flowerbed.length == 1) {
            if (flowerbed[0] == 0) {
                return true;
            }
        }

        // 间隔种花
        for (int i = 0; i < flowerbed.length; i++) {
            int left = i - 1;
            int right = i + 1;

            if (remain  == 0) {
                return true;
            }

            if (flowerbed[i] != 0) {
                continue;
            }

            // 当i = 0，只需要考虑右边
            if (i == 0 && right <= flowerbed.length - 1) {
                // 当i = 0，只需要考虑右边
                if (flowerbed[right] == 0) {
                    flowerbed[i] = 1;
                    remain--;
                }
            } else if (i == flowerbed.length - 1 && left >= 0) {
                // 当i = flowerbed.length - 1，只需要考虑左边
                if ( flowerbed[left] == 0) {
                    flowerbed[i] = 1;
                    remain--;
                }
            } else if (left >= 0 && right <= flowerbed.length - 1) {
                if (flowerbed[left] == 0 && flowerbed[right] == 0) {
                    flowerbed[i] = 1;
                    remain--;
                }
            }
        }

        return remain == 0;
    }
}
